package com.example.personalizededucationsystem.service.recommendation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 推荐策略工厂
 * 使用依赖注入自动收集所有 RecommendationStrategy 类型的 Bean。
 */
@Component
public class RecommendationStrategyFactory {
    private final Map<String, RecommendationStrategy> strategies;

    /**
     * Spring 在启动时会自动将所有实现了 RecommendationStrategy 接口的 Bean 注入到这个 List 中。
     *
     * @param strategyList 所有策略 bean 的列表
     */
    @Autowired
    public RecommendationStrategyFactory(List<RecommendationStrategy> strategyList) {
        // 将列表转换为 Map，方便按名称查找
        strategies = strategyList.stream()
                .collect(Collectors.toMap(RecommendationStrategy::getStrategyName, Function.identity()));
    }

    /**
     * 根据策略名称获取策略实例。
     *
     * @param strategyName 策略的唯一名称 (例如 "RANDOM", "WEAKEST_POINT")
     * @return 对应的策略实例
     */
    public RecommendationStrategy getStrategy(String strategyName) {
        RecommendationStrategy strategy = strategies.get(strategyName);
        if (strategy == null) {
            throw new IllegalArgumentException("未找到推荐策略: " + strategyName);
        }
        return strategy;
    }
}